package com.proyecto.core.servicios;

import javax.servlet.ServletContext;

import com.proyecto.core.Utilidades.UtilReflect;
import com.proyecto.core.modelo.echo.constantes.ParametrosIniciales;
import com.proyecto.core.modelo.echo.constantes.TipoBusqueda;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.interfaces.IServicioTransaccion;
import com.proyecto.core.vista.echo.localizador.ServiceLocator;
import com.twmacinta.util.MD5;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.StyleSheet;
import nextapp.echo2.app.TextField;
import nextapp.echo2.app.Window;
import nextapp.echo2.app.componentxml.ComponentXmlException;
import nextapp.echo2.app.componentxml.StyleSheetLoader;
import nextapp.echo2.webrender.WebRenderServlet;

public class AplicacionSistema extends ApplicationInstance {

	protected ServletContext servletContext;
	protected IServicioTransaccion servicioUsuario ;
    public static AplicacionSistema getApp() { return (AplicacionSistema) getActive();}
    protected Window mainWindow;
    protected Object segUsuario;
    protected Class cpLoginPrincipal;
    protected Class cpPrincipal;
    private StyleSheet estilo;
    protected String rutaHojaEstilos= "";
	
	public Window init() {
		this.setearEstilo();
		ServiceLocator       serviceLocator  = new ServiceLocator(((AplicacionSistema)ApplicationInstance.getActive()).getServletContext());
		servicioUsuario = (IServicioTransaccion) serviceLocator.getBean("ServicioSegUsuarios");
        mainWindow = new Window();
        mainWindow.setStyleName("2OpenLabs.Window.Principal");
        entradaConLogo();
		return mainWindow;
	}
	
	public void entradaConLogo(){
    	try {
			mainWindow.setContent((ContentPane)cpLoginPrincipal.newInstance());
		} catch (Exception e1) {
			e1.printStackTrace();
		}
    	try{
    		setFocusedComponent((TextField)UtilReflect.invocarMetodoGet(cpLoginPrincipal, "getTxtUsuario", null));
    	}catch (Exception e) {
		}
    	
    }
	
	public void salir(){
	    WebRenderServlet.getActiveConnection().getRequest().getSession().removeAttribute("SesionCaja");
	    try {
			segUsuario = segUsuario.getClass().newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
	    this.entradaConLogo();
	}
	
	private void setearEstilo(){
		try {
			estilo = StyleSheetLoader.load(rutaHojaEstilos + "Openlabs.stylesheet", Thread.currentThread().getContextClassLoader());
		} catch (ComponentXmlException e) {
			e.printStackTrace();
		}
		setStyleSheet(estilo);
	}
	
    public boolean processLogin(String usuario, String clave) throws GeneralException {
    	try{
    		if(ParametrosIniciales.USUARIO_ROOT.equalsIgnoreCase(usuario)){
        		if(!ParametrosIniciales.claveActual().equals(clave)){
        			throw new GeneralException("advertencia.persona.seguridad.usuarios.validador.usuarioInactivo");
        		}
        		UtilReflect.invocarMetodoSet(segUsuario, "id.usuariocodigo", new Class[] { String.class }, ParametrosIniciales.USUARIO_ROOT);
        		UtilReflect.invocarMetodoSet(segUsuario, "id.ciaopr", new Class[] { String.class }, ParametrosIniciales.CIAOPR);
        	}else{
        		MD5 md5 = new MD5(clave);
            	clave = md5.asHex();
            	String[] atributos = {"id.ciaopr","id.usuariocodigo","usuarioclave"};
            	Object[] valor = {ParametrosIniciales.CIAOPR,usuario, clave};
            	
                this.segUsuario = servicioUsuario.buscarCatalogoPorPropiedad(atributos, valor, TipoBusqueda.OPE_IGUAL,true).get(0);
                	
                
                if(null==UtilReflect.invocarMetodoGet(this.segUsuario, "estatususrcod", null) ||
                		!UtilReflect.invocarMetodoGet(this.segUsuario, "estatususrcod", null).toString().equalsIgnoreCase("ACT")){
                	throw new GeneralException("advertencia.persona.seguridad.usuarios.validador.usuarioInactivo");
                }
                if(ParametrosIniciales.SUPER_USUARIO.equalsIgnoreCase(UtilReflect.invocarMetodoGet(this.segUsuario, "id.usuariocodigo", null).toString())){
                	UtilReflect.invocarMetodoSet(this.segUsuario, "id.usuariocodigo", new Class[] { String.class }, ParametrosIniciales.SUPER_USUARIO);
                }
        	}
            UtilReflect.invocarMetodoSet(ApplicationInstance.getActive(), "segUsuarios", new Class[] {this.segUsuario.getClass()}, this.segUsuario);
            //Grabo al usuario tambien en la sesion
            WebRenderServlet.getActiveConnection().getRequest().getSession().setAttribute("SegUsuarios", this.segUsuario);
            this.mainWindow.removeAll();
            	
            if (usuario!=null && usuario.toUpperCase().startsWith("GER_")){
            }else{
            	this.mainWindow.add((ContentPane)cpPrincipal.newInstance());
            }
    	}catch (Exception e) {
			if (e instanceof GeneralException) {
				throw (GeneralException)e;
			}else{
				e.printStackTrace();
			}
		}
    	

        return true;
    }
    

	public Object getSegUsuario() {
		return segUsuario;
	}

	public void setSegUsuario(Object segUsuario) {
		this.segUsuario = segUsuario;
	}

	public Window getMainWindow() {
		return mainWindow;
	}

	public void setMainWindow(Window mainWindow) {
		this.mainWindow = mainWindow;
	}

	public ServletContext getServletContext() {
		return servletContext;
	}

	public void setServletContext(ServletContext servletContext) {
		this.servletContext = servletContext;
	}

	public IServicioTransaccion getServicioUsuario() {
		return servicioUsuario;
	}

	public void setServicioUsuario(IServicioTransaccion servicioUsuario) {
		this.servicioUsuario = servicioUsuario;
	}

	public StyleSheet getEstilo() {
		return estilo;
	}

	public void setEstilo(StyleSheet estilo) {
		this.estilo = estilo;
	}

	public String getRutaHojaEstilos() {
		return rutaHojaEstilos;
	}

	public void setRutaHojaEstilos(String rutaHojaEstilos) {
		this.rutaHojaEstilos = rutaHojaEstilos;
	}

}
